package com.newsanalysis.crawler;

import com.newsanalysis.analysis.NewsAnalysisService;
import com.newsanalysis.model.entity.News;
import com.newsanalysis.service.NewsService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Slf4j
@Component
@RequiredArgsConstructor
public class NewsCrawlerManager {
    
    private final NewsService newsService;
    private final WebCrawler webCrawler;
    private final NewsAnalysisService newsAnalysisService;
    
    @Value("${crawler.thread.pool.size}")
    private int threadPoolSize;
    
    @Value("${crawler.auto.analyze}")
    private boolean autoAnalyze;
    
    // 定义爬虫目标网站
    private static final Map<String, String[]> TARGET_WEBSITES = new HashMap<>();
    
    static {
        // 新浪新闻各个版块
        TARGET_WEBSITES.put("新浪新闻", new String[] {
            "https://news.sina.com.cn/", // 新浪新闻首页
            "https://news.sina.com.cn/china/", // 国内新闻
            "https://news.sina.com.cn/world/", // 国际新闻
            "https://finance.sina.com.cn/", // 财经新闻
            "https://tech.sina.com.cn/", // 科技新闻
            "https://sports.sina.com.cn/", // 体育新闻
            "https://ent.sina.com.cn/", // 娱乐新闻
            "https://edu.sina.com.cn/" // 教育新闻
        });
        
        // 网易新闻各个版块
        TARGET_WEBSITES.put("网易新闻", new String[] {
            "https://news.163.com/", // 网易新闻首页
            "https://news.163.com/domestic/", // 国内新闻
            "https://news.163.com/world/", // 国际新闻
            "https://money.163.com/", // 财经新闻
            "https://tech.163.com/", // 科技新闻
            "https://sports.163.com/", // 体育新闻
            "https://ent.163.com/", // 娱乐新闻
            "https://edu.163.com/" // 教育新闻
        });
        
        // 腾讯新闻各个版块
        TARGET_WEBSITES.put("腾讯新闻", new String[] {
            "https://news.qq.com/", // 腾讯新闻首页
            "https://news.qq.com/china_index.shtml", // 国内新闻
            "https://news.qq.com/world_index.shtml", // 国际新闻
            "https://finance.qq.com/", // 财经新闻
            "https://new.qq.com/ch/tech/", // 科技新闻
            "https://sports.qq.com/", // 体育新闻
            "https://new.qq.com/ch/ent/", // 娱乐新闻
            "https://edu.qq.com/" // 教育新闻
        });
        
        // 搜狐新闻各个版块
        TARGET_WEBSITES.put("搜狐新闻", new String[] {
            "https://www.sohu.com/news", // 搜狐新闻首页
            "https://news.sohu.com/", // 新闻中心
            "https://business.sohu.com/", // 财经新闻
            "https://it.sohu.com/", // 科技新闻
            "https://sports.sohu.com/", // 体育新闻
            "https://yule.sohu.com/", // 娱乐新闻
            "https://learning.sohu.com/" // 教育新闻
        });
    }
    
    /**
     * 定时爬虫任务，每3小时执行一次
     */
    @Scheduled(fixedDelayString = "${crawler.interval}")
    public void scheduledCrawling() {
        log.info("开始定时爬取新闻任务...");
        crawlNews();
    }
    
    /**
     * 手动触发爬虫任务
     */
    public void crawlNews() {
        try {
            // 获取所有网站的URL列表
            List<String> allUrls = TARGET_WEBSITES.values().stream()
                    .flatMap(urls -> List.of(urls).stream())
                    .collect(Collectors.toList());
            
            log.info("开始爬取新闻，目标网站: {}, 总URL数: {}", TARGET_WEBSITES.keySet(), allUrls.size());
            
            // 爬取所有目标网站
            webCrawler.startCrawling(allUrls);
            
            // 如果配置了自动分析，则对新爬取的新闻进行分析
            if (autoAnalyze) {
                analyzeUnprocessedNews();
            }
            
        } catch (Exception e) {
            log.error("爬虫任务执行失败: {}", e.getMessage(), e);
        }
    }
    
    /**
     * 爬取特定网站的新闻
     * 
     * @param siteName 网站名称（如"新浪新闻"、"网易新闻"等）
     * @return 成功爬取的新闻数量
     */
    public int crawlNewsBySite(String siteName) {
        try {
            String[] urls = TARGET_WEBSITES.get(siteName);
            if (urls == null || urls.length == 0) {
                log.warn("未找到指定的网站配置: {}", siteName);
                return 0;
            }
            
            log.info("开始爬取 {} 的新闻，URL数: {}", siteName, urls.length);
            List<String> urlList = List.of(urls);
            
            // 创建新的爬虫实例进行爬取
            int count = webCrawler.startCrawlingAndReturnCount(urlList);
            
            // 如果配置了自动分析，则对新爬取的新闻进行分析
            if (autoAnalyze) {
                analyzeUnprocessedNews();
            }
            
            return count;
        } catch (Exception e) {
            log.error("爬取{}新闻失败: {}", siteName, e.getMessage(), e);
            return 0;
        }
    }
    
    /**
     * 分析未处理的新闻（无分类或无情感分析的新闻）
     */
    private void analyzeUnprocessedNews() {
        log.info("开始分析未处理的新闻...");
        // 这里简化处理，实际应用中应该分批处理大量数据
        List<News> newsList = newsService.findAll(null).getContent();
        
        // 过滤出未分析的新闻
        List<News> unprocessedNews = newsList.stream()
                .filter(news -> news.getCategory() == null || news.getSentiment() == null)
                .collect(Collectors.toList());
        
        if (!unprocessedNews.isEmpty()) {
            log.info("发现 {} 条未分析的新闻，开始分析...", unprocessedNews.size());
            newsAnalysisService.batchAnalyzeNews(unprocessedNews);
            log.info("新闻分析完成");
        } else {
            log.info("没有发现未分析的新闻");
        }
    }
    
    /**
     * 获取可爬取的网站列表
     * 
     * @return 网站名称列表
     */
    public List<String> getAvailableSites() {
        return TARGET_WEBSITES.keySet().stream().collect(Collectors.toList());
    }
}

